﻿/**
getterMethod:控件的获得值得方法
setterMethod： 控件赋值的方法
init： 控件的初始化
drawFn： 如何用html绘制这个控件
**/

var fieldTypeMethods={
	"text":{
		"getterMethod":function(id) {
			return $("#"+id).val();;
		},"setterMethod":function(id,v) {
			$("#"+id).val(v);
		},"drawFn":function(id,obj,v) {
			var tempInput="<input id='"+id+"' name='"+id+"'  type='text' style='width:100%' value=''/>";
			return tempInput;
		}
	},
	"combox":{
		"getterMethod":function(id) {
			return $("#"+id).combobox('getValue');
		},"setterMethod":function(id,v) {
			$("#"+id).combobox('setValue',v);
		},"init":function(id,comboxList) {
			$('#'+id).combobox({  
				valueField:'id',  
				textField:'text',
				data:comboxList
			});	
		},"drawFn":function(id,obj,v) {
			//easyui的控件的宽度初始化不能通过设置css完成，这里用初始化的时候指定宽度完成
			var widthStr="width:"+cf.inputCSS.width;
			if(v.cssOpinion && v.cssOpinion.width) widthStr="width:"+v.cssOpinion.width;
			var tempInput="<input id='"+id+"' name='"+id+"'  type='text' style='"+widthStr+"' value=''/>";
			return tempInput;
		}
	},
	"radio":{
		"getterMethod":function(id) {
			var id="input[name='"+id+"']:checked";
			return $(id).val();;
		},"setterMethod":function(id,v) {
			var id="input[name='"+ide+"'][value='"+v+"']";				
			$(id).attr("checked",true); 
		},"drawFn":function(id,obj) {
			var result="";
			if(obj) {
				$.loop(obj, function (v, i) {
					result=result+"<label for='"+id+"'>"+v.text+"</label>"+("<input type='radio' name='"+id+"' value='"+v.id+"' />&nbsp;");
				}, true);		
			}
			return result;
		}
	},
	"checkbox":{
		"getterMethod":function(id) {
			var id="input[name='"+id+"']:checked";
			return $(id).val();;
		},"setterMethod":function(id,v) {
			var id="input[name='"+ide+"'][value='"+v+"']";				
			$(id).attr("checked",true); 
		},"drawFn":function(id,obj) {
			var result="";
			if(obj) {
				$.loop(obj, function (v, i) {
					result=result+"<label for='"+id+"'>"+v.text+"</label>"+("<input type='checkbox' name='"+id+"' value='"+v.id+"' />&nbsp;");
				}, true);		
			}
			return result;
		}
	},"textarea":{
		"getterMethod":function(id) {
			return $("#"+id).val();
		},"setterMethod":function(id,v) {
			$("#"+id).combobox('setValue',v);
		},"drawFn":function(id,obj,v) {
			var result="<textarea id='"+id+"' name='"+id+"' value=''></textarea>";
			return result;
		}
	},
	"datebox":{
		"getterMethod":function(id) {	
			return $('#'+id).datebox("getValue"); 
		},"setterMethod":function(id,v) {
			$('#'+id).datebox("setValue",v);  
		},"init":function(id,comboxList) {
			$('#'+id).datebox(); 
		},"drawFn":function(id,obj,v) {
			//easyui的控件的宽度初始化不能通过设置css完成，这里用初始化的时候指定宽度完成
			var widthStr="width:"+cf.inputCSS.width;
			if(v.cssOpinion && v.cssOpinion.width) widthStr="width:"+v.cssOpinion.width;
			var tempInput="<input id='"+id+"' name='"+id+"'  type='text' style='"+widthStr+"' value=''/>";
			return tempInput;
		}
	}
	};


/**
字段中包含的信息
field(字段的名称)
formhidden（表单字段是否显示 默认显示）
isNewLine（是否在新的一行显示）
formType(组件类型)
formValidate(验证信息)
formDefault(默认值)
formList(如果是下拉框 下拉框列表信息)
css:(表单控件的自定义样式)
**/
var cf={"formFieldsOpinions":[],
		"labelCSS":{"width":"150px"},//标签的宽度
		"inputCSS":{"width":"150px"},//输入框的宽度
		"formLineNum":2,//每一行显示多少个输入框 （1行1列 1行两列）
};

/**
表单控件的初始化
formOpinions里面初始化了一些基本属性，这里会扩展这些属性，使用jquery的扩展功能extend
**/
cf.initOfJson=function(obj){
	cf=$.extend({},cf,obj);
	//cf.formFieldsOpinions=obj.formFieldsOpinions;
};


/**
 * 保存表单时候，获取表单对象的值；这里调用字段类型对应的取值方法
 * @param defineFieldsInfo
 * @return
 */
cf.getForm=function(){
	var result={};
    $.loop(cf.formFieldsOpinions, function (v, i) {
    	var id=v.field;
    	var formType=v.formType;
		var fieldValue=fieldTypeMethods[formType].getterMethod(id);
		result[id]=fieldValue;
    }, false);		
	myLog("getForm",result,"");
	return result;
}

$(function() {
	$(document).keypress(function(event) {
		if (event.keyCode == 13) {
			var result=cf.getForm();
			alert(JSON.stringify(result));
		}
	});
});

/**
 * 编辑form时候，为form各个控件赋值。这里调用字段类型对应的赋值方法。这里的formObj可以是表格的一行记录，如果添加页面时候，这个字段的值可以为null，跳过赋值阶段。
 * @param formObj
 * @param defineFieldsInfo
 * @return
 */
cf.setForm=function() {
    $.loop(cf.formFieldsOpinions, function (v, i) {
    	var id=v.field;
    	var formType=v.formType;
		var fieldValue=getUrlParam(id);
		if(fieldValue) {
			var fieldValue=fieldTypeMethods[formType].setterMethod(id,fieldValue);
		}
    }, false);		
}
/**
 * 打开表单的时候，为表单添加验证。这里的验证兼容easyui的验证功能；也可以自定义验证，比如后台验证。
 * @param defineFieldsInfo
 * @return
 */
cf.initFormValidate=function(defineFieldsInfo) {
    $.loop(cf.formFieldsOpinions, function (v, i) {
    	var id=v.field;
    	var formValidate=v.formValidate;
		if(formValidate) {
		    $('#'+id).validatebox(formValidate);		
		}
    }, false);
}
/**
 * 绘制表单
 */
cf.drawForm=function() {
	myLog("drawForm");
	var tempDiv=$("<div id='mainDivContainer' align='center'></div>").appendTo($("body"));
	var ctable=$("<table id='mainTable' style='font-size:12px;'></table>").appendTo(tempDiv);
	var currentTr=null;
	var inputCount=0;
    //$.loop(cf.formFieldsOpinions, function (v, i) {
	
	for(var i=0;i<cf.formFieldsOpinions.length;i++) {
		var v=cf.formFieldsOpinions[i];
		myLog("当前指标信息",v);
		if(v.formhidden) {
			$("<input type='hidden' id='"+v.field+"' name='"+v.field+"' value=''></input>").appendTo(tempDiv);
			continue; 
		}
		inputCount++;
    	var id=v.field;
		if(!currentTr) {
			currentTr=$("<tr></tr>").appendTo(ctable);
		}
		var labelTd=$("<td class='colTitle'></td>").appendTo(currentTr);
		labelTd.html(v.title);
		var inputTd=$("<td class='colValue'></td>").appendTo(currentTr);
		if(fieldTypeMethods[v.formType].drawFn) {
			var inputHtmStr=fieldTypeMethods[v.formType].drawFn(v.field,v.formList,v);
			myLog("控件HTML生成结果：",null,inputHtmStr);			
			var tempInput=$(inputHtmStr).appendTo(inputTd);
		}
		if((inputCount==cf.formLineNum) ||  v.isNewLine) {
			currentTr=null;
			inputCount=0;
		}
		if(v.isNewLine) {
			inputTd.attr("colspan",cf.formLineNum*2-1);	
		}			
		
	}
    //}, true);	
	myLog("当前生成的html",null,$("body").html());
}


/**
 * 表单控件初始化
 */
cf.initInputType=function() {
	myLog("initInputType:");	
    $.loop(cf.formFieldsOpinions, function (v, i) {
    	var id=v.field;
    	var formType=v.formType;
		var formList=v.formList;
		var inputInitMethod=fieldTypeMethods[formType].init;
		if(inputInitMethod) {
			inputInitMethod(id,formList);
		}
		if(v.cssOpinion) {
			myLog(v.title+"增加css",v.cssOpinion,"");	
			$("#"+v.field).css(v.cssOpinion);	
		}
		if(v.opinion) {
			myLog(v.title+"增加属性",v.opinion,"");	
			for(var o in v.opinion) {
				$("#"+v.field).attr(o,v.opinion[o]);	
			}	
		}
    }, true);
}

cf.cssSetup=function() {
	myLog("cssSetup");
	if(cf.labelCSS) {
		myLog("labelCSS:",cf.labelCSS);
		$(".colTitle").css(cf.labelCSS);
	}
	if(cf.inputCSS) {
		myLog("inputCSS:",cf.inputCSS);
		$(".colValue").css(cf.inputCSS);
	}
}



/**
 * 首先初始化控件；初始化grid；
 * 点击新增按钮的时候或者修改按钮的时候，绘制表单（生成静态的表单还是内存中的表单）；为表单赋值；为表单添加验证
 * 点击保存的时候获取表单的值
 * 
 */

cf.formInitHandler=function() {
	cf.drawForm();
	cf.cssSetup();	
	cf.initInputType();
	cf.setForm();
	cf.initFormValidate();
}


function getUrlParam(paramName) {
    var url = window.location.href;
    var oRegex = new RegExp('[\?&]' + paramName + '=([^&]+)', 'i');
    var oMatch = oRegex.exec(url);
    if (oMatch && oMatch.length > 1) {
        return decodeURI(oMatch[1]);
    } else {
        return "";
    }
}


function myLog(mess,obj,ss) {
var str=obj?JSON.stringify(obj):"";
	if(ss) str=str+ss;
	console.log(new Date()+"  "+mess+"  "+str);
}


//循环数组
$.loop = function (array, fn, type, si, ei) {
    if (array) {
        type = type == false ? false : true;
        if (type) {
            si = si || 0;
            ei = ei || array.length;
            for (var i = si; i < ei; i++) {
                if (fn(array[i], i) == false) {
                    break;
                }
            }
        }
        else {
            si = si || array.length - 1;
            ei = ei || 0;
            for (var i = si; i >= ei; i--) {
                if (fn(array[i], i) == false) {
                    break;
                }
            }
        }
    }
}